package com.share.user.service.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.share.common.core.context.SecurityContextHolder;
import com.share.common.core.domain.R;
import com.share.user.api.domain.UpdateUserLogin;
import com.share.user.api.domain.UserCountVo;
import com.share.user.api.domain.UserInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.share.user.mapper.UserInfoMapper;
import com.share.user.service.IUserInfoService;

/**
 * 用户Service业务层处理
 *
 * @author YC
 */
@Service
public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> implements IUserInfoService {

    @Autowired
    private WxMaService wxMaService;

    @Override
    public List<UserInfo> selectUserInfoList(UserInfo userInfo) {
        return baseMapper.selectUserInfoList(userInfo);
    }

    @Override
    public UserInfo wxLogin(String code) {
        try {
            // 使用微信临时登录code、微信公众平台id、秘钥（微信公众平台id、秘钥使用配置文件读取到WxMaConfig返回wxMaService的Bean） 请求微信接口服务，返回openid
            WxMaJscode2SessionResult sessionInfo = wxMaService.getUserService().getSessionInfo(code);
            String openId = sessionInfo.getOpenid();

            // 查询数据库user表中有没有此openId的用户
            UserInfo userInfo = baseMapper.selectOne(
                    new LambdaQueryWrapper<UserInfo>()
                            .eq(UserInfo::getWxOpenId, openId)
            );
            // 如果表里面没有此用户，则是第一次登录
            if (userInfo == null) {
                // 添加登录用户信息到数据库表
                userInfo = new UserInfo();
                userInfo.setNickname(String.valueOf(System.currentTimeMillis()));
                userInfo.setAvatarUrl("https://oss.aliyuncs.com/aliyun_id_photo_bucket/default_handsome.jpg");
                userInfo.setWxOpenId(openId);
                baseMapper.insert(userInfo);
            }
            // 返回登录用户uerInfo信息
            return userInfo;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public Boolean isFreeDeposit() {
        // 查询当前登录用户信息
        UserInfo userInfo = baseMapper.selectById(SecurityContextHolder.getUserId());
        //设置押金状态
        userInfo.setDepositStatus("1");
        return baseMapper.updateById(userInfo) > 0;
    }

    /**
     * 业务逻辑：
     * Echarts柱状图示例数据：[150, 230, 224, 218, 135, 147, 260] ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
     * Echarts柱状图数据格式是两个list集合，但需要一次给到前端，所以使用一个Map集合放两个List集合
     */
    @Override
    public Map<String, Object> getUserCount() {
        List<UserCountVo> list = baseMapper.selectUserCount();
        //获取所有日期
        List<String> dateList = list.stream()
                .map(UserCountVo::getRegisterDate)
                .collect(Collectors.toList());
        //获取所有数据
        List<Integer> countList = list.stream()
                .map(UserCountVo::getCount)
                .collect(Collectors.toList());
        //放到map集合，返回
        Map<String, Object> map = new HashMap<>(2);
        map.put("dateList", dateList);
        map.put("countList", countList);
        return map;
    }

    @Override
    public R<Boolean> updateUserLogin(UpdateUserLogin updateUserLogin) {
        return null;
    }
}
